#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// C语言中，即使是地址传递，传递的也是地址的拷贝
// 将数组名arr传递给函数func时，指针传递仍是按值传递的
// 这意味着函数func中的str是原指针的一份拷贝
// 即使传递的是指向数组第一个元素的指针，但对str的任何修改都不会影响原指针arr
char * func(char * str) {
    str += 3;
    return str;
}

// 函数指针的用法
int add(int a, int b){
    return (a + b);
} // 函数的入口地址存在程序代码区

int main() {
    char arr[] = "abcdef", *p; // 局部变量存在栈区
    p = func(arr);
    printf("arr = %s\n", arr);
    printf("p = %s\n", p);
    
    int (*pfunc)(int, int); // 返回类型是int，接受两个int类型参数的函数指针
    pfunc = add; // 将函数add的入口地址存入pfunc
    printf("%d\n", (*pfunc)(1, 2)); // 函数指针的用法：*(pfunc)(int, int)

    // int *pfunc(int, int); // 这不是函数指针，而是返回一个int型指针，接受两个int类型参数的函数
    // 且函数的定义不能嵌套（不能在一个函数内部定义另一个函数），只能嵌套的调用
    
    return 0;
    
}